package cn.tedu.csmall.commons.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 该工具用于生成和解析JWT
 *
 */
@Slf4j
public class JwtUtils {
    //指定密钥
    private static final String SECRET_KEY = "qwertreytr";
    //指定有效期 7天
    private static final Long EXPIRED_IN_MINUTE = 7L*24*60;

    //为了避免外部随意创建对象，将构造方法进行私有化
    private JwtUtils(){};

    //生成JWT方法
    public static String generate(Map<String, Object> claims){
        //jwt组成部分：头(Header[类型、算法])、载荷(Payload)、签名(Signature)
        String jwt = Jwts.builder()
                // 通常配置2个属性：typ（类型）、alg（算法）
                .setHeaderParam("typ","jwt")
                .setHeaderParam("alg","HS256")
                // Payload：用于配置需要封装到JWT中的数据
                .setClaims(claims)
                //  设置数据的有效期
                .setExpiration(new Date(System.currentTimeMillis()
                        +EXPIRED_IN_MINUTE*60*1000))
                // Signature：用于指定算法与密钥（盐）
                .signWith(SignatureAlgorithm.HS256,SECRET_KEY)
                .compact();
        return jwt;
    }

    //解析JWT方法
    public static Claims parse(String jwt){
        Claims claims =
                Jwts.parser().setSigningKey(SECRET_KEY)
                        .parseClaimsJws(jwt).getBody();
       return claims;
    }
}
